package com.me.common.util;

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.NoOp;

/**
 * CGLIB 动态代理: 拿到代理对象的工具类
 *
 * @author ME
 * @date   2019/12/2
 */
public class CglibProxyUtil {

    /**
     * 通过 CGLIB 创建目标对象（的子类）
     *
     * @param target            需要创建代理的目标类
     * @param callbacks         增强逻辑，CGLIB本身只支持单个 callback
     * @param callbackFilter    增强逻辑过滤器，传入多个 callback 时，可以为不同方法指定不同 callback
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T getProxy(Class<T> target, Callback[] callbacks, CallbackFilter callbackFilter) {
        Enhancer enhancer = new Enhancer();
        // 设置需要创建代理的（目标）类
        enhancer.setSuperclass(target);
        // 设置 方法拦截器（MethodInterceptor）
        enhancer.setCallbacks(callbacks);
        // 设置 方法拦截器过滤器，根据过滤器定义的规则使用不同的 Callback
        enhancer.setCallbackFilter(callbackFilter);
        // 是否对生成的动态代理类使用缓存，默认：true
        enhancer.setUseCache(true);
        // 通过 CGLIB 创建子类实例
        return (T) enhancer.create();
    }
    
}
